'''
author : 极简XksA
data : 2018.8.26
goal : 获取微信好友性别、分布、微信昵称，可视化分析
'''

# from wxpy import *
# 1. 获取数据
# # 初始化一个机器人对象
# # cache_path缓存路径，给定值为第一次登录生成的缓存文件路径
# bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl")
# #获取好友列表(包括自己)
# my_friends = bot.friends(update=False)
# '''
# stats_text 函数：帮助我们简单统计微信好友基本信息
# 简单的统计结果的文本
#     :param total: 总体数量
#     :param sex: 性别分布
#     :param top_provinces: 省份分布
#     :param top_cities: 城市分布
#     :return: 统计结果文本
# '''
# print(my_friends.stats_text())

from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 2.绘制性别分布饼图
# import matplotlib.pyplot as plt
#
# labels = ['男性', '女性', '其他']
# sizes = [57.1, 32.2, 10.7]
# explode = (0, 0.1, 0)
#
# fig1, ax1 = plt.subplots()
# ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
#         shadow=True, startangle=90)
# # 纵横相等，画成一个圆
# ax1.axis('equal')
# plt.legend()
# plt.show()

# 3.绘制城市分布条形图
# import numpy as np
# import matplotlib.pyplot as plt
#
#
# n_groups = 10
#
# means_men = (10.2,8.98,8.57,2.04,2.04,1.63,1.63,1.22,1.22,1.22)
#
# fig, ax = plt.subplots()
#
# index = np.arange(n_groups)
# bar_width = 0.35
#
# opacity = 0.4
# error_config = {'ecolor': '0.3'}
#
# rects1 = ax.bar(index, means_men, bar_width,alpha=opacity, color='b', error_kw=error_config,label='城市')
#
# ax.set_xlabel('城市名称')
# ax.set_ylabel('数据占比(%)')
# ax.set_title('好友城市Top10')
# ax.set_xticks(index + bar_width / 2)
# ax.set_xticklabels(('荆州', '武汉', '黄石', '海淀', '广州','深圳', '黄冈', '杭州', '长沙', '昌平'))
# ax.legend()
#
# fig.tight_layout()
# plt.show()

# 4.绘制好友省份分布地图
# from pyecharts import Map
#
# value = [359.2, 65.3, 49.0, 20.4, 20.4, 16.3, 16.3, 12.2, 12.2,12.2]
# attr = [
#     "湖北", "广东", "北京", "湖南", "上海", "浙江", "河南", "安徽", "山东","福建"
#     ]
# map = Map("好友分布省份Top10", width=600, height=400)
# map.add(
#     "",
#     attr,
#     value,
#     maptype="china",
#     is_visualmap=True,
#     visual_text_color="#000",
# )
# map.render()

# 5.获取好友微信名称，词云分析
from wxpy import *
from os import path
import re, jieba
import matplotlib.pyplot as plt
#词云生成工具
from wordcloud import WordCloud,ImageColorGenerator
#需要对中文进行处理
import matplotlib.font_manager as fm

# 清洗数据，生成词云图
#获取当前的项目文件加的路径
d=path.dirname(__file__)
#读取停用词表
stopwords_path=d + '/static/stopwords.txt'

#定义个函数式用于分词
def jiebaclearText(text):
    #定义一个空的列表，将去除的停用词的分词保存
    mywordList=[]
    #进行分词
    seg_list=jieba.cut(text,cut_all=False)
    #将一个generator的内容用/连接
    listStr='/'.join(seg_list)
    listStr = listStr.replace("class","")
    listStr = listStr.replace("span", "")
    listStr = listStr.replace("emoji", "")
    #打开停用词表
    f_stop=open(stopwords_path,encoding="utf8")
    #读取
    try:
        f_stop_text=f_stop.read()
    finally:
        f_stop.close()#关闭资源
    #将停用词格式化，用\n分开，返回一个列表
    f_stop_seg_list=f_stop_text.split("\n")
    #对默认模式分词的进行遍历，去除停用词
    for myword in listStr.split('/'):
        #去除停用词
        if not(myword.split()) in f_stop_seg_list and len(myword.strip())>1:
            mywordList.append(myword)
    return ' '.join(mywordList)

# 生成词云图
def make_wordcloud(text1,i):
	bg = plt.imread(d+r"/image/爱心01.jpg")
	# 生成
	wc = WordCloud(# FFFAE3
		background_color="#FFFFFF",  # 设置背景为白色，默认为黑色
		width=990,  # 设置图片的宽度
		height=440,  # 设置图片的高度
		mask=bg,
		margin=10,  # 设置图片的边缘
		max_font_size=70,  # 显示的最大的字体大小
		random_state=20,  # 为每个单词返回一个PIL颜色
		font_path=d+'/static/simkai.ttf'  # 中文处理，用系统自带的字体
	).generate(text1)
	# 为图片设置字体
	my_font = fm.FontProperties(fname=d+'/static/simkai.ttf')
	# 图片背景
	bg_color = ImageColorGenerator(bg)
	# 开始画图
	plt.imshow(wc.recolor(color_func=bg_color))
	# 为云图去掉坐标轴
	plt.axis("off")
	# 画云图，显示
	# 保存云图
	wc.to_file(d+r"/image/render_0%d.png"%i)


# bot = Bot(cache_path=d + "/wxpy.pkl")
bot = Bot(cache_path=True)
#获取好友列表(包括自己)
my_friends = bot.friends(update=False)
# 微信昵称
nick_name = ''
# 微信个性签名
wx_signature = ''
for friend in my_friends:
	# 微信昵称：NickName
	nick_name = nick_name + friend.raw['NickName']
	# 个性签名：Signature
	wx_signature = wx_signature + friend.raw['Signature']

nick_name = jiebaclearText(nick_name)
wx_signature = jiebaclearText(wx_signature)
make_wordcloud(nick_name,1)
make_wordcloud(wx_signature,2)

# # 获取微信公众号名称
# wx_public_name = ''
# # 公众号简介
# wx_pn_signature = ''
# # 获取微信公众号列表
# my_wx_pn = bot.mps(update=False)
# for wx_pn in my_wx_pn:
# 	wx_public_name = wx_public_name + wx_pn.raw['NickName']
# 	wx_pn_signature = wx_pn_signature + wx_pn.raw['Signature']
#
# wx_public_name = jiebaclearText(wx_public_name)
# make_wordcloud(wx_public_name,3)
# wx_pn_signature = jiebaclearText(wx_pn_signature)
# make_wordcloud(wx_pn_signature,4)